<?php
namespace Dingo\Api\Auth\Provider;

use Tymon\JWTAuth\JWTAuth;
use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Exceptions\JWTException;

use Exception;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;

class JWT extends Authorization {
    protected $auth;

    public function __construct(JWTAuth $auth) {
        $this->auth = $auth;
    }

    public function authenticate(Request $request, Route $route) {
        $token = $this->getToken($request);

        try {
            if (! $user = $this->auth->setToken($token)->authenticate()) {
                throw new UnauthorizedHttpException('JWTAuth', 'Unable to authenticate with invalid token.');
            }
        } catch ( JWTException $exception ) {
            throw new UnauthorizedHttpException('JWTAuth', $exception->getMessage(), $exception);
        }

        return $user;
    }
    protected function getToken(Request $request) {
        try {
            $this->validateAuthorizationHeader($request);

            $token = $this->parseAuthorizationHeader($request);
        } catch (Exception $exception) {
            if ( ! $token = $request->query('token', false) ) throw $exception;
        }

        return $token;
    }
    protected function parseAuthorizationHeader(Request $request) {
        return trim(str_ireplace($this->getAuthorizationMethod(), '', $request->header('authorization')));
    }
    public function getAuthorizationMethod() {
        return 'bearer';
    }
}
